4章 暗号化
akht.icon
暗号(cryptography)はイーサリアムだけでなく全てのブロックチェーンの基盤技術の1つ。 暗号を使うことでこのようなことができる。
ある秘密を知っているということを、その秘密の内容を明らかにすることなく証明できる
データの信頼性を証明できる
しかし、イーサリアムプロトコルのどの部分にも暗号化は用いられていない(本書の執筆時点)。
プラットフォーム上やノード間での全てのコミュニケーションは暗号化されておらず誰にでも読むことができる。
よって、誰もがステートのアップデートが正しいことを検証し、合意形成を行うことができる。
将来的には、
などの発達した暗号ツールによって、
合意形成を取りながら暗号化された計算をブロックチェーン上に記録できるようになる。
4.1 鍵とアドレス
イーサリアムには2つの異なるタイプのアカウントがある
EOAでは以下を使ってそのアカウントに紐づけられたイーサの所有権を確立する
イーサリアムアドレス (Ethereum addresses)
この中でも秘密鍵が中心的な枠割りを果たす
秘密鍵からイーサリアムアドレス(アカウント)を導出する
固有かつ唯一
秘密鍵からデジタル署名を作成する
デジタル署名は秘密鍵の所有を証明する
秘密鍵は、送信、保存など、どのような形であれイーサリアムシステム上で直接使用されることはない
秘密鍵は秘密にしておかなければならない
ネットワーク上に流したり、ブロックチェーン上に保存してはいけない
アカウントアドレスとデジタル署名だけが、イーサリアムシステム上で伝搬され保存される
イーサリアムも
EOAのイーサリアムアドレスは、公開鍵から生成される
※コントラクトアカウントは秘密鍵に裏付けられていない
4.2 公開鍵暗号と暗号通貨
どうなるんだろ〜kurotaky.icon
情報を保護するためにある固有の鍵が使用される
その鍵は「ある方向に計算するのは簡単だが、逆方向に計算するのは難しい」という特徴を持つ関数によって生成される
これらの関数を使って、秘密情報や偽造不可能なデジタル署名などの暗号が作成可能になる
どういう特徴か
「大きな素数の掛け算は簡単だが、素因数分解は難しい」
私が 8,018,009 という数字を提示し、これが 2つの素数の積であると言ったとしましょう。
素因数の 1つが 2,003であるとわかれば、8,018,009 ÷ 2,003 = 4,003といった簡単な割り算でもう片方の数字を見つけられます。
秘密情報の一部がわからないと関数を逆算することが難しいものをトラップドア関数 (trapdoor function)という 逆にいうと、ある情報がある場合は逆関数の演算が簡単なもの
素数を法とする乗算は単純な手順で済むが、除算(逆算)は現実的に不可能
これは 離散対数問題 (discrete logarithm problem) として知られている 現在のところトラップドアは知られていない
これを応用したのが楕円曲線暗号 (elliptic curve cryptography) 暗号通貨の秘密鍵やデジタル署名の基礎になっている
イーサリアムでは公開鍵暗号が使われる
公開鍵と秘密鍵のペアを作る(公開鍵は秘密鍵から作られる)
デジタル署名を生成するのにも秘密鍵が必要
※公開鍵は秘密鍵から簡単に計算できるので、秘密鍵だけ保管しておけばいいが、ほとんどのウォレットでは利便性の観点からキーペアとして両方を保管しているらしい
任意のメッセージ(イーサリアムではトランザクションの内容自体)に対して作成・署名することができる
メッセージと秘密鍵を組み合わせて、秘密鍵を知っていなければ生成できないコードを生成する
そのコードがデジタル署名と呼ばれるもの
楕円曲線数学により、誰でもデジタル署名がトランザクション内容とアクセスが要求されているイーサリアムアドレスに一致しているかを確認し、トランザクションが有効であるかを検証できる
トランザクションがイーサリアムアドレスに対応した公開鍵かどうか
秘密鍵を持つ人物のみから送信されたか
これが疑いなく決定される
4.3 秘密鍵
秘密鍵は実質、ランダムに選ばれた数字
コインを256回投げれば秘密鍵のバイナリが得られる
4.3.1 無作為な数字から秘密鍵を生成する
鍵を生成するために必要なもの
秘密鍵の作成 = 「1から2^256の間の数字を選ぶ」
予測不可能で再現性がなければOK
イーサリアムではOSの乱数生成器を使って無作為な256ビットを生成する
4.4 公開鍵
イーサリアムの公開鍵は、楕円曲線上の点 (point)である
秘密鍵が楕円曲線方程式を満たすx, y座標のセットあることを意味する
秘密鍵があれば公開鍵を計算できるが、逆はほぼ不可能(総当りしかない)
4.4.1 楕円曲線暗号の解説
楕円曲線暗号は、楕円曲線上の点の加算や乗算によって表現される、離散対数問題に基づいた非対称暗号方式、または公開鍵暗号のひとつ
(このあとの話は本にて)
4.4.2 楕円曲線演算
(楕円曲線演算の話がある)
加算
加算を拡張して乗算を定義
4.4.3 公開鍵の生成
秘密鍵(k)と生成点G(定数)を掛けて公開鍵(K)を得る
K = k * G
4.4.4 楕円曲線ライブラリ
暗号通貨関連で使われるものは以下の2つ
OpenSSLを置き換えるために書かれてるやつ
4.5 暗号ハッシュ関数
暗号ハッシュ関数はイーサリアムに限らずあらゆる暗号システムで使われてる
任意のサイズのデータを固定サイズのデータにマップさせるために使える任意の関数のこと
任意のサイズのデータを固定サイズのビット列にマップする一方向ハッシュ関数
一方向 (one-way)であることが重要
ハッシュ値(出力)を知っているだけでは入力を再生成することが計算上不可能ということ
総当りするしかないようなもの
ハッシュ値の衝突 (hash collision)
異なる入力から同じハッシュ値が出力されること
イーサリアムなどでは事実上起こらない
暗号ハッシュ関数の特徴
決定性
入力が同じなら常に同じハッシュ値を出力する
検証性
ハッシュ値の計算が効率的
無相関
入力がわずかでも異なれば出力されるハッシュ値が大きく異なる(元の入力との相関がない)
不可逆性
出力から入力を計算するのが(ほぼ)無理
衝突保護
同じハッシュ値になる入力を計算によって求めることが(ほぼ)無理
衝突に対する耐性はデジタル署名の偽造を防ぐために非常に重要
暗号ハッシュ関数のお役立ちどころ
データフィンガープリント
メッセージの整合性(エラー検出)
認証(パスワードハッシングとキーストレッチ)
擬似乱数発生器
メッセージの約定(約定-開示メカニズム)
一意な識別子
4.5.1 イーサリアムの暗号ハッシュ関数:Keccak-256
このKeccak-256にはスノーデン絡みのあれこれがあるらしい
SHA-3ではなく、Keccak-256が使われてる
4.5.2 どのハッシュ関数を使用しているのか
FIPS-202 SHA-3とKeccak-256はどちらも「SHA-3」と呼ばれる
あるライブラリがどっちを実装してるか調べるには?
空の入力を与えて出力を調べる
Keccak256("")= c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
SHA3("")= a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
4.6 イーサリアムアドレス
イーサリアムアドレス = 公開鍵またはコントラクトから派生したユニークな識別子
秘密鍵から公開鍵を導出、Keccak-256でハッシュ化、その最後の20バイトを取り出し0xプレフィックスをつけたもの
4.6.1 イーサリアムアドレスフォーマット
イサーリアムアドレスは16進数の数値で、公開鍵をKeccak-256でハッシュ化した最後の20バイトからできている
チェックサムを含まない
4.6.2 ICAP (Internet Content Adaptation Protocol)
ICAP
イーサリアムアドレスエンコーディング
国際銀行勘定番号 (international Bank Account Number : IBAN)エンコーディングと部分的に号感性がある
多目的、チェックサム付き、かつ相互運用可能なエンコーディングを提供する
本書時点では残念ながらICAPをサポートしてるウォレットは多くないらしい
4.6.3 大文字を使用するチェックサム付き16進数エンコーディング (EIP-55)
EIP-55 (Ethereum Improvement Proposal 55)
16進数アドレスの一部を大文字化して、従来のイーサリアムアドレスに対して互換性のあるチェックサムを提供する
イーサリアムのアドレスは大文字小文字を区別しない
これをサポートしてるウォレットでは大文字小文字によるチェックサムを検証してエラーを検出することができる
割と単純な実装で実現されてる
アドレスとハッシュ値(アドレスからKeccak-256で生成)を並べる
ハッシュ値に対応する16進数が0x8以上になっている箇所を大文字にする
4.6.4 EIP-55でエンコードされたアドレスのエラーを検出する
転記間違いなどでアドレスが間違っていた場合、それを小文字に直したものをKeccak-256に通してハッシュ化することでチェックサムハッシュを計算する
それを再び並べて、同じルールで大文字にしようとすると全く異なっていることがわかる
これはハッシュ関数の無相関性によるもの(1ビットしか違わなくても結果は大きく異なる)
4.7まとめ
公開鍵暗号
アドレスの生成と検証
ハッシュ関数
hr.icon
次章!